package log

///
// Log库
///
import (
	library ".."
)

// DBLog 底层日志类
type DBLog struct {
	Port
	Rlogin bool // 远程数据库
	db     library.DB
	// 缓存
	cache *library.Cache
}

// Init 初始化
func (L *DBLog) Init(file string) {
	// 数据库类型
	if L.Rlogin {
		L.db = library.DB{Type: "mysql"} // 初始化远程数据库
		// 打开数据库文件
		L.db.Open(file)
	} else {
		L.db = library.DB{Type: "sqlite3"} // 初始化本地数据库
		// 打开数据库文件
		L.db.OpenFile(file)
	}
	// 初始化信息
	L.db.CreateTable("Log", "Log")         //  创建 Log 表
	L.db.CreateTable("Timeout", "Timeout") //  创建 Timeout 表
	// 初始化缓冲
	L.cache = L.db.GetCache()
	L.cache.Add("Log", `INSERT INTO Log(Time,Ttype,Path,Data) values(?,?,?,?)`)
	L.cache.Add("Timeout", "INSERT INTO Timeout(Time,Memory,Timeout,TimeoutMax,Value,CtackInformation) VALUES (?,?,?,?,?,?)")
	//  继承处理
	{
		// Log 写日志
		L.Log = func(Data []byte) {
			// 写日志到数据库
			L.cache.Write("Log",
				library.Time,
				LogTtypeLog,
				library.CallMyName(1),
				Data)
		}
		// Error 写错误
		L.Error = func(Data []byte) {
			// 写日志到数据库
			L.cache.Write("Log",
				library.Time,
				LogTtypeError,
				library.CallMyName(1),
				Data)
		}
		// Warn 写警告
		L.Warn = func(Data []byte) {
			// 写日志到数据库
			L.cache.Write("Log",
				library.Time,
				LogTtypeWarn,
				library.CallMyName(1),
				Data)
		}
		// Debug 写调试
		L.Debug = func(Data []byte) {
			// 写日志到数据库
			L.cache.Write("Log",
				library.Time,
				LogTtypeDebug,
				library.CallTrace(1),
				Data)
		}
		// LogS 写日志文本
		L.LogS = func(Data string) {
			// 写日志到数据库
			L.Log([]byte(Data))
		}
		// ErrorS 写错误文本
		L.ErrorS = func(Data string) {
			// 写日志到数据库
			L.Error([]byte(Data))
		}
		// WarnS 写警告文本
		L.WarnS = func(Data string) {
			// 写日志到数据库
			L.Warn([]byte(Data))
		}
		// DebugS 写调试文本
		L.DebugS = func(Data string) {
			// 写日志到数据库
			L.Debug([]byte(Data))
		}
		// GetTimeout 得到 Timeout
		L.GetTimeout = func() *Timeout {
			T := &Timeout{}
			T.Callback = func(T *Time, limit bool) func() {
				return func() {
					if T.Lock {
						if limit {
							L.cache.Write("Timeout", library.Time, library.MemorySize(), -T.Period, 1, *T.Value, library.CallTrace(1))
						} else {
							L.cache.Write("Timeout", library.Time, library.MemorySize(), -T.Period, 0, *T.Value, library.CallTrace(1))
						}

					}
					T.TakeEffect = false
				}
			}
			T.Init()
			return T
		}
		// Close 关闭日志
		L.Close = func() {
			// 关闭事务
			L.cache.Close()
			// 关闭数据库
			L.db.Close()
		}
	}
}

// GetDB 得到数据库
func (L *DBLog) GetDB() library.DB {
	return L.db
}
